\chapter{文件}

\section{文件I/O}

\subsection{open()}

文件是存储数据的一种常用方式，程序可以从文件中读取和写入数据，从而实现对数据的持久化存储。\\

在对文件进行操作之前，首先需要使用open()函数打开文件，open()函数可以指定要打开的文件名和打开方式。\\

\begin{table}[H]
    \centering
    \setlength{\tabcolsep}{5mm}{
        \begin{tabular}{|c|l|}
            \hline
            \textbf{打开方式} & \textbf{功能}                                      \\
            \hline
            r                 & 只读，文件必须存在，否则打开失败                   \\
            \hline
            w                 & 只写，创建一个新文件                               \\
            \hline
            a                 & 追加，如果文件不存在则创建；存在则将数据追加到末尾 \\
            \hline
            r+                & 以r模式打开文件，附带写的功能                      \\
            \hline
            w+                & 以w模式打开文件，附带读的功能                      \\
            \hline
            a+                & 以a模式打开文件，附带读的功能                      \\
            \hline
        \end{tabular}
    }
    \caption{文件打开方式}
\end{table}

在对文件操作完成之后，需要调用close()函数关闭文件。采用with语句可以实现对资源的自动释放，不需要手动调用close()函数。\\

\subsection{文件I/O}

通过文件的方法可以对文件的I/O操作。\\

\begin{table}[H]
    \centering
    \setlength{\tabcolsep}{4mm}{
        \begin{tabular}{|l|l|}
            \hline
            \textbf{方法} & \textbf{功能}                  \\
            \hline
            read()        & 默认读取全部，可设置读取个数   \\
            \hline
            readline()    & 读取每行数据，可设置读取个数   \\
            \hline
            readlines()   & 读取所有数据行，以列表形式返回 \\
            \hline
            write()       & 写入数据                       \\
            \hline
            writelines()  & 写入一组数据                   \\
            \hline
        \end{tabular}
    }
    \caption{文件I/O}
\end{table}

\vspace{0.5cm}

\mybox{解析单词}

\begin{lstlisting}[title=quotes.txt]
Talk is cheap. Show me the code.
Code never lies, comments sometimes do.
Stay Hungry Stay Foolish.
\end{lstlisting}

\begin{lstlisting}[language=Python]
import string

output_file = open("words.txt", "w")

with open("quotes.txt") as file:
    for line in file:
        words = line.split()
        for word in words:
            word = word.strip(string.punctuation)
            output_file.write(word + "\n")

output_file.close()
\end{lstlisting}

\begin{tcolorbox}
    \mybox{运行结果}
    \textbf{words.txt}
    \begin{verbatim}
Talk
is
cheap
Show
me
the
code
Code
never
lies
comments
sometimes
do
Stay
Hungry
Stay
Foolish
	\end{verbatim}
\end{tcolorbox}

\newpage

\section{csv}

\subsection{csv}

CSV（Comma-Separated Values）是一种以纯文本方式进行数据记录的存储格式，每行数据使用逗号分隔。\\

利用CSV数据格式可以方便实现大数据系统中对于数据采集结果的信息记录和传输，同时CSV文件也可以使用Excel查看。\\

\mybox{邮箱}

\begin{lstlisting}[title=user\_info.csv]
ID,First Name,Last Name
9012,Rachel,Booker
2070,Laura,Grey
4081,Craig,Johnson
9346,Mary,Jenkins
5079,Jamie,Smith
\end{lstlisting}

\begin{lstlisting}[language=Python]
import csv

with open("user_info.csv", "r") as file:
    reader = csv.reader(file)
    next(reader)
    user_info = list(reader)

with open("user_email.csv", "w", newline="\n") as file:
    writer = csv.writer(file)
    writer.writerow(["ID", "First Name", "Last Name", "Email"])
    for user in user_info:
        id, first_name, last_name = user

        writer.writerow([
            id, first_name, last_name,
            (last_name[0] + first_name + id + "@gmail.com").lower()
        ])
\end{lstlisting}

\begin{tcolorbox}
    \mybox{运行结果}
    \textbf{user\_email.csv}
    \begin{verbatim}
ID,First Name,Last Name,Email
9012,Rachel,Booker,brachel9012@gmail.com
2070,Laura,Grey,glaura2070@gmail.com
4081,Craig,Johnson,jcraig4081@gmail.com
9346,Mary,Jenkins,jmary9346@gmail.com
5079,Jamie,Smith,sjamie5079@gmail.com
\end{verbatim}
\end{tcolorbox}

\newpage